# -*- coding: utf-8 -*-
"""
#-------------------------------------------------------------------------------
# Nom:         exportCSV
# Auteur:      Alain Gauthier
#
# Créé le:     26/02/2013
# Copyright:   (c) eaucéa 2014
# Licence:     GNU Public Licence (GPL)

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/

Sérialisation de données d'une couche vectorielle vers des fichiers CSV.
Chaque fichier CSV est nommé selon un identifiant unique des entités de la couche vectorielle.
Le but de ce module est de construire un fichier CSV contenant des chroniques
de pluie, évapotranspiration par identifiant de la couche vectorielle.


Ce script doit être lancé depuis la console python de QGIS

#-------------------------------------------------------------------------------
"""

# modules système
import csv
import os
# modules QGIS
from qgis.core import *

#------------------------------------------------------------------------------#

class ExportateurChroniqueCSV:
    """
    Classe servant à sérialiser des données d'une couche vectorielle vers des fichiers CSV.
    Chaque fichier CSV est nommé selon un identifiant unique des entités de la couche vectorielle.
    """

    #--------------------------------------------------------------------------#

    def __init__(self,Acouche,Achemin,Aprefixe,AchampIdent):
        """
        Constructeur prenant en paramètres :
            Acouche : la couche vectorielle QGIS dont on veut exporter des données
            Achemin : l'emplacement où écrire les données
            Aprefixe : nom du sous-dossier qui contiendra tous les fichiers CSV
            AchampIdent : nom du champ identifiant servant à générer les noms des fichiers
        """
        self.coucheVec = Acouche
        self.racineDest = Achemin
        self.dossierDest = Aprefixe
        self.champIdent = AchampIdent

        # données mémoire
        self._dicoDonnees = dict()
        # noms fichiers
        self._dicoFichiers = dict()

    #--------------------------------------------------------------------------#

    def getdicoFichiers(self):
        """
        accesseur au dictionnaire de fichiers
        """
        return self._dicoFichiers

    #--------------------------------------------------------------------------#

    def definirChamps(self,Aliste):
        """
        déclaration des champs des fichiers CSV à construire.
        Remplit les sérialisateurs csv de chaque fichier à traiter
        """
        for ident in self._dicoFichiers:
#            csv_writer = csv.writer(self._dicoFichiers[ident], Aliste, delimiter=';',quoting=csv.QUOTE_NONE)
#            csv_writer.writerow(Aliste)
            self._dicoDonnees[ident] = []
            self._dicoDonnees[ident].append(Aliste)

    #--------------------------------------------------------------------------#

    def exporterVersCSV(self,Adate,AlisteChamps):
        """
        ajout d'une ligne contenant les valeurs Adate et des attributs AlisteChamps de self.coucheVec
        """
        # indice des champs
        tabIndices = []
        indice_ident = self.coucheVec.fieldNameIndex(self.champIdent)
        tabIndices.append(indice_ident)
        for nomChamp in AlisteChamps:
            tabIndices.append(self.coucheVec.fieldNameIndex(nomChamp))

        # parcours de coucheVec
        request=QgsFeatureRequest()
        request.setSubsetOfAttributes(tabIndices)
        for entite in self.coucheVec.getFeatures(request):
            # les données de chaque entité sont écrites dans le fichier correspondant à leur identifiant
            tab = entite.attributes()
            clefIdent = unicode(tab[indice_ident]).encode("iso-8859-1")
            ligne = [Adate]
            # remplissage
            for clef in tabIndices:
                if not (clef==indice_ident):
                    ligne.append(unicode(tab[clef]).encode("iso-8859-1"))
            # écriture
            self._dicoDonnees[clefIdent].append(ligne)


    #--------------------------------------------------------------------------#

    def ouvrirFichiers(self):
        """
        ouverture des fichiers associés au champ identifiant de self.coucheVec
        construit le dictionnaire des descripteurs des fichiers ouverts ayant pour clef le champ identifiant
        """
        # chemin d'écriture
        chemin_dst = os.path.join(self.racineDest,self.dossierDest)
        # création du dossier si nécessaire
        if not os.path.exists(chemin_dst):
            os.mkdir(chemin_dst)
        # indice du champ identifiant
        indice_ident = self.coucheVec.fieldNameIndex(self.champIdent)
        if indice_ident<0:
            raise KeyError("champ identifiant %s non trouvé" % self.champIdent)
        # parcours de coucheVec
        nomFichiers = []
        request=QgsFeatureRequest()
        request.setSubsetOfAttributes([indice_ident])
        for entite in self.coucheVec.getFeatures(request):
            attributs = entite.attributes()
            nomFichiers.append(unicode(attributs[indice_ident]).encode("iso-8859-1"))

        # ouverture en mode écriture des fichiers à partir des nom des identifiants
        for nomIdent in nomFichiers:
            fichier = os.path.join(chemin_dst,nomIdent+'.csv')
#            fid = open (fichier, 'w')
            self._dicoFichiers[nomIdent]=fichier

    #--------------------------------------------------------------------------#

    def enregistrerTout(self):
        """
        finalise l'écriture des fichiers CSV
        """
        for ident in self._dicoFichiers:
            # ouverture du fichier
            fid = open (self._dicoFichiers[ident], 'w')
            try:
                # sérialisation et écriture des données
                csv_writer = csv.writer(fid, self._dicoDonnees[ident][0], delimiter=';',quoting=csv.QUOTE_NONE)
                for ligne in self._dicoDonnees[ident]:
                    csv_writer.writerow(ligne)
            finally:
                fid.close()

    #--------------------------------------------------------------------------#

    def declarerFichierLog(self,Afichierlog):
        """
        pour ajouter des log en debug
        """
        self._fichierlog = Afichierlog

    #--------------------------------------------------------------------------#

if __name__ == '__main__':
    raise EnvironmentError("module devant être exécuté sous console/extension python QGIS")
